#ifndef _LIBASM_H
#define _LIBASM_H

#include "defs.h"

/*
 * Funcion: lidt
 * -------------
 * Carga el IDTR con el valor que se le pase.
 */
void lidt (IDTR *idtr);
void _lidt (IDTR *idtr);

/*
 * Funcion: _lgdt
 * -------------
 * Carga el GDTR con el valor que se le pase.
 */
void lgdt (GDTR *idtr);
void _lgdt (GDTR *idtr);

/*
 * Funciones: maskPIC1, maskPIC2
 * -----------------------------
 * Escriben en el pic la mascara que se le pase como parametro.
 */
void maskPIC1 (byte mascara);
void maskPIC2 (byte mascara);

/*
 * Funciones: Cli, Sti
 * -------------------
 * Son las correspondientes cli y sti de assembler.
 */
void Cli(void);
void _Cli(void);
void Sti(void);
void _Sti(void);

/*
 * Funciones: int_08_hand, int_09_hand, int_80_hand
 * -----------------------------------
 * Son los handlers de las interrupciones tal cual como se
 * cargan en la IDT.  Estas funciones invocan a las correspondientes
 * int_08 e int_09 escritas en kernel.c
 */
void int_08_hand(void);
void int_09_hand(void);
void int_80_hand(void);

/*
 * Funciones: invop_hand, ssf_hand, snp_hand(void), div0_hand, gpf_hand,
 * bounds_hand, pagefault_hand
 * -----------------------------------
 * Son los handlers de las interrupciones tal cual como se
 * cargan en la IDT.  Estas funciones se ocupan de las distintas excepciones
 */
void invop_hand(void);
void ssf_hand(void);
void snp_hand(void);
void div0_hand(void);
void gpf_hand(void);
void bounds_hand(void);
void pagefault_hand(void);

/*
 * Funcion: eoi
 * ------------
 * Le enva al pic el end of interrupt.
 */
void eoi(void);

/*
 * Funcion: _Lights
 * ------------
 * Controla las luces del teclado (num lock, caps lock, scr lock)
 */
void _Lights(char keys);

/*
 * Funcion: debug
 * --------------
 * Utilizaba para debug en el bochs.
 */
void debug (void);

/*
 * Funcion: readcmos
 * -----------------
 * Lee del CMOS el valor del registro nro. reg y lo devuelve en su nombre.
 */
int readcmos(int reg);

/*
 * Funcion: readcmos
 * -----------------
 * Escribe en el registro nro. reg del CMOS el valor value.
 */
int writecmos(int value, int reg);

/*
 * Funciones: _DelCursor, _RestoreCursor
 * -----------------
 * Funciones para el manejo del cursor por hardware.
 */
void _DelCursor(void);
void _RestoreCursor(void);

/*
 * Funciones: read_cr0, write_cr0, read_cr3, write_cr3
 * -----------------
 * Funciones para el manejo de los registros involucrados en la habilitacion
 * y uso de la paginacion.
 */
unsigned long read_cr0(void);
void write_cr0(unsigned long value);
unsigned long read_cr3(void);
void write_cr3(unsigned long value);

byte _inb(int io);

void _free_task(unsigned int pid, int status);
void _doexit(int status);
int _waitpid(int pid);


#endif /* _LIBASM_H */

